/**
 *
 * @author Gratien
 */
package edu.com.gestionstock.controleur;

import edu.com.gestionstock.bean.Livres;
import edu.com.gestionstock.bean.Dvd;
import javax.swing.JOptionPane;

import edu.com.gestionstock.dao.DAO;
import edu.com.gestionstock.dao.bo.DvdDAO;
import edu.com.gestionstock.dao.bo.LivresDAO;
import edu.com.gestionstock.vue.FenetrePrincipale;
import edu.com.gestionstock.vue.PanneauAfficheStock;

import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;

public class ControleurSupprimeStock
{

    private FenetrePrincipale fenetrePrincipale;
    private PanneauAfficheStock fenetreStock;
    private DefaultTableModel tableau;
    private Dvd dvd = new Dvd();
    private Livres livre = new Livres();
    private DAO<Dvd> DvdDao = new DvdDAO();
    private DAO<Livres> LvDao = new LivresDAO();
    private Integer row;

    public ControleurSupprimeStock(PanneauAfficheStock paramFenetreStock)
    {
        this.fenetreStock = paramFenetreStock;
        this.tableau = fenetreStock.getModele();
    }

    public void checkDelete()
    {
        //On récupère la ligne dans le tableau qui est selectionné
        row = this.fenetreStock.getTableau().getSelectedRow();

        //On vérifie s'il y a une ligne de séléctionnée, sans cela on affiche un message d'erreur
        if ( row >= 0 )
        {

            //On recupére les valeurs d'une ligne spécifique du tableau
            Integer id = Integer.decode(this.tableau.getValueAt(row, 0).toString());
            String titre = null;
            String genre = null;
            String type = this.tableau.getValueAt(row, 3).toString();
            Integer nombre = null;
            String acteur = null;
            String realisateur = null;

            //Récupérer les données de la DB sur base de l'id
            //check si ID existe

            if ( type.contains("DVD") )
            {
                dvd = DvdDao.find(id);

                //Je pars du principe que le champ Titre est obligatoire, donc si ce champ est vide alors c'est que l'ID n'existe pas en DB
                if ( dvd.getTitre() != null )
                {
                    //S'il existe un DVD avec cet identifiant, on recupére les informations
                    id = dvd.getId();
                    titre = dvd.getTitre();
                    genre = dvd.getGenre();
                    type = "DVD";
                    nombre = dvd.getQuantiteStock();
                    acteur = dvd.getActeurs();
                    realisateur = dvd.getRealisateur();
                }
                else
                {
                    //Pas de titre, donc pas d'ID trouvé dans la DB, on remet id à null pour générer l'erreur
                    id = null;
                }
            }
            else
            {
                livre = LvDao.find(id);

                //Je pars du principe que le champ Titre est obligatoire, donc si ce champ est vide alors c'est que l'ID n'existe pas en DB
                if ( livre.getTitre() != null )
                {
                    //S'il existe un livre avec cet identifiant, on recupére les informations
                    id = livre.getId();
                    titre = livre.getTitre();
                    genre = livre.getGenre();
                    type = "Livre";
                    nombre = livre.getQuantiteStock();
                    realisateur = livre.getAuteur();
                }
                else
                {
                    //Pas de titre, donc pas d'ID trouvé dans la DB, on remet id à null pour générer l'erreur
                    id = null;
                }
            }

            //si id n'est pas null on traite la suppression, sinon affichage d'erreur

            if ( id.equals(null) )
            {
                JOptionPane.showMessageDialog(null, "Erreur, données inexistante dans la DB");
            }
            else
            {
                //Vérification que le nombre d'article en stock est égal à 0 ou moins avant de supprimer (sécurité..)
                if ( nombre <= 0 )
                {
                    //Affichage de la fenetre de confirmation de la suppression des données

                    if ( JOptionPane.showConfirmDialog(this.fenetrePrincipale,
                            "Voulez-vous vraiment Supprimer l'article \n"
                            + type + " " + id + ": " + titre + ", " + realisateur + " ?", "Annuler",
                            JOptionPane.YES_NO_OPTION)
                            == JOptionPane.YES_OPTION )
                    {
                        //Suppression de l'article
                        if ( type.contains("DVD") )
                        {
                            deleteDVD(dvd);
                        }
                        else
                        {
                            deleteLivre(livre);
                        }
                    }
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Impossible de supprimer un article dont le stock n'est pas nul");
                }
            }

        }
        else
        {
            JOptionPane.showMessageDialog(null, "Veuillez séléctionner la ligne à supprimer");
        }
    }

    private void deleteDVD(Dvd obj)
    {
        //Suppression dans la DB
        DvdDao.delete(obj);

        //On supprime la ligne dans l'affichage (on pourrait aussi retracer tout le tableau, mais question de performance je trouve ca plus interressant)
        this.fenetreStock.getModele().removeRow(this.row);
    }

    private void deleteLivre(Livres obj)
    {
        //Suppression dans la DB
        LvDao.delete(obj);

        //Suppression dans l'affichage stock
        this.fenetreStock.getModele().removeRow(this.row);
    }
}